/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package utilidades;

/**
 *
 * @author diego
 */

import javax.swing.*;
import java.util.*;

/**
* Clase que implementa el Modelo de JList para elementos ordenados.
* @author JERF
* @version 1.0
* @see javax.swing.AbstractListModel
*/
public class OrdListModel extends AbstractListModel {
    private final SortedSet modelo;

    /**
    * Constructor del Modelo
    */
    public OrdListModel() {
        modelo = new TreeSet();
    }

    /**
     * Metodo para obtener el total de elementos
     * @return Total de elementos o 0 en su defecto
     */
    @Override
    public int getSize() {
        return modelo.size();
    }
    public int size(){
        return this.getSize();
    }

    /**
     * Metodo que regresa el objeto contenido en el indice indicado
     * @param i indice a revisar
     * @return Objecto contenido en el indice o null en su defecto
     */
    @Override
    public Object getElementAt(int i) { 
        return modelo.toArray()[i];
    }

    /**
     * Metodo que agrega un objeto a la lista ordenada
     * @param o Objeto que se agregara
     */
    public void add(Object o) {
        if(modelo.add(o))
            fireContentsChanged(this, 0, getSize()); 
    }
    public void addElement(Object o){
        this.add(o);
    }

    /**
     * Metodo que agrega todo un arreglo a la lista
     * @param o Arreglo a agregar
     */
    public void addAll(Object o[]) {
        Collection c = Arrays.asList(o);
        modelo.addAll (c);
        fireContentsChanged(this, 0, getSize());
    }

    /**
     * Metodo que limpia la lista
     */
    public void clear() {
        modelo.clear();
        fireContentsChanged(this, 0, getSize());
    }

    /**
     * Metodo que dice si se contiene o no un objeto indicado en la lista
     * @param o Objeto a buscar
     * @return true en caso de encontrarlo o false en su defecto
     */
    public boolean contains(Object o) { 
        return modelo.contains(o);
    }

    /**
     * Metodo que retorna el primer objeto de la lista
     * @return Objeto en el tope de la lista
     */
    public Object first() {
        return modelo.first();
    }

    /**
     * Metodo que retorna el ?ltimo elemento de la lista
     * @return Objeto en el final de la lista
     */
    public Object last() {
        return modelo.last();
    }

    /**
     * Metodo que retorna el iterator correspondiente a la lista
     * @return Iterator correspondiente a la lista
     * @see java.util.Iterator
     */
    public Iterator iterator() {
        return modelo.iterator();
    }

    /**
     * Metodo que quita un objeto de la lista
     * @param o Objeto a borrar
     * @return true si fue removido o false en su defecto
     */
    public boolean removeElement(Object o) {
        boolean r = modelo.remove(o);
        if(r)
            fireContentsChanged(this, 0, getSize());
        return r;
    }

    /**
     * Metodo que retorna el contenido de la lista como un arreglo
     * @return Arreglo de Objetos de la lista
     */
    public Object[] elements() {
        return modelo.toArray();
    }

    /**
     * Metodo que retorna el contenido de la lista como un arreglo
     * @return Arreglo de Objetos de la lista
     */
    public Object[] toArray() {
        return elements();
    }
}
